package packetsender;

import java.nio.ByteBuffer;
import java.util.Arrays;

/**
 * 扩展ByteBuffer, 用于处理客户端发过来的数据.
 * @author 	林岑
 * @time	2012年3月31日 14:11:37
 */
public class LemonByteBuffer implements InBuffer, OutBuffer{

	private ByteBuffer buff;

	/**
	 * 初始化一个扩展缓冲区.长度为data的长度. 初始位置为0
	 * @param data
	 */
	public LemonByteBuffer( byte [] data, int positionStop ) {
		buff = ByteBuffer.allocate( data.length );
		buff.put(data);
		buff.position(positionStop);
	}

	/**
	 * 新建一个定长的缓冲区, 作用和ByteBuffer相同
	 * @param limit
	 */
	public LemonByteBuffer(int limit){
		this.buff = ByteBuffer.allocate(limit);
	}
	
	@Override
	public ByteBuffer getByteBuffer() {
		return this.buff;
	}

	@Override
	public final void position(int pos) {
		this.buff.position(pos);
	}
	
	@Override
	public final int position(){
		return buff.position();
	}

	@Override
	public final byte get(){
		return buff.get();
	}

	@Override
	public final short getShort(){
		return buff.getShort();
	}

	@Override
	public final int getInt(){
		return buff.getInt();
	}

	
//	/**
//	 * 此方法用户获取缓冲区中的字符串, 该字符串的结尾和C 里面的相同, 以'\0'结尾. 如果该缓冲区中没有 '\0'标记, 
//	 * 那么该方法会返回一个空串
//	 */
//	public final String getString() {
//		int limit = this.buffer.limit();
//
//		byte [] data = new byte[limit];
//
//		final int start = this.position();		//开始位置
//
//		for (int pos = start; pos < limit; pos++) {
//
//			data[pos - start] = this.buffer.get();
//
//			if(data[pos - start] == '\0') {
//				return getString(data, 0, pos);
//			}
//		}
//		this.buffer.position(start);			//没有取到字符串移回之前的位置
//		return "";
//	}

	/**
	 * 在缓冲区中当前指针所在位置开始, 指定size大小的空间中获取一个字符串, 这个字符串以空格(32)填充.
	 *  
	 * @param size 指定大小的空间
	 * @return
	 */
	@Override
	public final String getString(int size) {

		byte[] dst = new byte[size];

		this.buff.get(dst, 0, size);

//		int posStop = 0;
//		for (int pos = dst.length - 1; pos >= 0; pos--) {	//从dst的末尾一位开始扫描, 找到第一个不为32的位置, 并将其截取出来
//			if (dst[pos] != ' ' && dst[pos] != '\0') {
//				posStop = pos;
//				break;
//			}
//		}
//
//		dst = Arrays.copyOf(dst, posStop + 1);

		return new String(dst).trim();
	}


	/**
	 * 开辟一个size大小的空间, 放入一个字符串, 多的截取, 少的补空格: 32
	 * @param str
	 * @param size 指定大小的空间
	 */
	@Override
	public void putString(String str, int size) {
		byte [] dat = str.getBytes();
		byte [] temp = new byte[size];
		for (int i = 0; i < size; i++) {
			if(i < dat.length) {
				temp[i] = dat[i];
			} else {
				temp[i] = ' ';
			}
		}
		this.buff.put(temp);
	}

	/*
	 * 读取字符串, 从data的第i个字节开始读取length个长度
	 */
	public static final String getString(byte[] data, int i, int length) {
		return new String(Arrays.copyOfRange(data, i, length + i));
	}

	@Override
	public final int limit(){
		return buff.limit();
	}

	@Override
	public void flip() {
		this.buff.flip();
	}

	@Override
	public void put(byte dat) {
		this.buff.put(dat);
	}

	@Override
	public void put(byte[] bytes) {
		this.buff.put(bytes);
	}

	@Override
	public void putShort(short das) {
		this.buff.putShort(das);
	}

	@Override
	public void putInt(int h) {
		this.buff.putInt(h);
	}

	public static void main(String[] args) {
//		byte[] bytes = "0123456789".getBytes();
//				bytes[7] = '\0';
//
//					
//		SuperByteBuffer ss = new SuperByteBuffer(bytes);
//		System.out.println(ss.getString() + "    ====");
//		SuperByteBuffer ss = new SuperByteBuffer(320);
//		ss.putString("a12314sdf", 32);
//		ss.putString("lincen", 32);
//		ss.flip();
//		System.out.println(ss.getString(32));
//		System.out.println(ss.getString(32));
		String temp = "123123";
		LemonByteBuffer ss = new LemonByteBuffer(32);
		ss.putString(temp, 32);
		ss.position(0);
		System.out.println(Arrays.toString(ss.getString(32).getBytes()));
	}

	@Override
	public void put(ByteBuffer b) {
		this.buff.put(b);
	}

	/**
	 * @param b
	 * @param p
	 */
	@Override
	public void put(int p, byte b) {
		this.buff.put(p, b);
	}


	//	public static void main(String[] args) {
	//		byte [] data = "0123456789abcdefg".getBytes();
	//		data = Arrays.copyOfRange(data, 6, data.length);		//截取出有用数据		从请求类型后移位到最后一个字节
	//		
	//		System.out.println(new String(data));
	//		
	//		
	//		List<String> lis = new ArrayList<String>();
	//		lis.add("agbsdf");
	//		lis.add("165asd4");
	//		System.out.println(lis.contains("*s*"));
	//		System.out.println("abasdf".matches(".*a.*"));
	//	}
}
